Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


LXST/Mixer.py 79da27abaaec0df1d51f0dd03ffeeb94af092cb3 (79da27ab) Text, 7.40 KB

Tff7b72import T7ee787RNS
Tff7b72import T7ee787LXST
Tff7b72import T7ee787time
Tff7b72import T7ee787math
Tff7b72import T7ee787threading
Tff7b72import T7ee787numpy Tff7b72as T7ee787np
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque
Tff7b72from T7ee787inspect Tff7b72import Te6edf3currentframe
Tff7b72from T7ee787.T7ee787Codecs Tff7b72import Te6edf3CodecTb4b4b4, Te6edf3Raw
Tff7b72from T7ee787.T7ee787CodecsT7ee787.T7ee787Codec Tff7b72import Te6edf3resample
Tff7b72from T7ee787.T7ee787Sinks Tff7b72import Te6edf3LocalSink
Tff7b72from T7ee787.T7ee787Sources Tff7b72import Te6edf3LocalSourceTb4b4b4, Te6edf3Backend

Tff7b72class T56d364MixerTb4b4b4(Te6edf3LocalSourceTb4b4b4, Te6edf3LocalSinkTb4b4b4)Tb4b4b4:
Te6edf3MAX_FRAMES Tff7b72= T79c0ff8
Te6edf3TYPE_MAP_FACTOR Tff7b72= Te6edf3npTff7b72.Td2a8ffiinfoTb4b4b4(Ta5d6ff"Ta5d6ffint16Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffmax

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3target_frame_msTff7b72=T79c0ff40Tb4b4b4, Te6edf3samplerateTff7b72=Tff7b72NoneTb4b4b4, Te6edf3codecTff7b72=Tff7b72NoneTb4b4b4, Te6edf3sinkTff7b72=Tff7b72NoneTb4b4b4, Te6edf3gainTff7b72=T79c0ff0.0Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffincoming_frames Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8fftarget_frame_ms Tff7b72= Te6edf3target_frame_ms
Tff7b72selfTff7b72.Td2a8ffframe_time Tff7b72= Tff7b72selfTff7b72.Td2a8fftarget_frame_msTff7b72/T79c0ff1000
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffmixer_thread Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffmixer_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinsert_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmuted Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffgain Tff7b72= Te6edf3gain
Tff7b72selfTff7b72.Td2a8ffbitdepth Tff7b72= T79c0ff32
Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_sink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_source Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_codec Tff7b72= Tff7b72None

Tff7b72if Te6edf3samplerateTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72= Te6edf3samplerate
Tff7b72if Te6edf3sinkTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsink Tff7b72= Te6edf3sink
Tff7b72if Te6edf3codecTb4b4b4: Tff7b72selfTff7b72.Td2a8ffcodec Tff7b72= Te6edf3codec
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff startingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffmixer_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff_mixer_jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmixer_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False

Tff7b72def Td2a8ffset_gainTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3gainTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3gain Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffgain Tff7b72= T79c0ff0.0
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffgain Tff7b72= Tffa657floatTb4b4b4(Te6edf3gainTb4b4b4)

Tff7b72def Td2a8ffmuteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3muteTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3mute Tff7b72== Tff7b72True Tff7b72or Te6edf3mute Tff7b72== Tff7b72FalseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmuted Tff7b72= Te6edf3mute
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmuted Tff7b72= Tff7b72False

Tff7b72def Td2a8ffunmuteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3unmuteTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3unmute Tff7b72== Tff7b72True Tff7b72or Te6edf3unmute Tff7b72== Tff7b72FalseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmuted Tff7b72= Te6edf3unmute
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmuted Tff7b72= Tff7b72False

Tff7b72def Td2a8ffset_source_max_framesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sourceTb4b4b4, Te6edf3max_framesTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffinsert_lockTb4b4b4:
Tff7b72if Tff7b72not Te6edf3source Tff7b72in Tff7b72selfTff7b72.Td2a8ffincoming_framesTb4b4b4: Tff7b72selfTff7b72.Td2a8ffincoming_framesTb4b4b4[Te6edf3sourceTb4b4b4] Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Te6edf3max_framesTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffincoming_framesTb4b4b4[Te6edf3sourceTb4b4b4] Tff7b72= Te6edf3dequeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffincoming_framesTb4b4b4[Te6edf3sourceTb4b4b4]Tb4b4b4, Te6edf3maxlenTff7b72=Te6edf3max_framesTb4b4b4)

Tff7b72def Td2a8ffcan_receiveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_sourceTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3from_source Tff7b72in Tff7b72selfTff7b72.Td2a8ffincoming_framesTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elif Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffincoming_framesTb4b4b4[Te6edf3from_sourceTb4b4b4]Tb4b4b4) Tff7b72< Tff7b72selfTff7b72.Td2a8ffMAX_FRAMESTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False

Tff7b72def Td2a8ffhandle_frameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3frameTb4b4b4, Te6edf3sourceTb4b4b4, Te6edf3decodedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffinsert_lockTb4b4b4:
Tff7b72if Tff7b72not Te6edf3source Tff7b72in Tff7b72selfTff7b72.Td2a8ffincoming_framesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffincoming_framesTb4b4b4[Te6edf3sourceTb4b4b4] Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Tff7b72selfTff7b72.Td2a8ffMAX_FRAMESTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Te6edf3sourceTff7b72.Td2a8ffchannels

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsamplerateTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72= Te6edf3sourceTff7b72.Td2a8ffsamplerate
Tff7b72selfTff7b72.Td2a8ffsamples_per_frame Tff7b72= Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftarget_frame_msTff7b72/T79c0ff1000Tb4b4b4)Tff7b72*Tff7b72selfTff7b72.Td2a8ffsamplerateTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffframe_time Tff7b72= Tff7b72selfTff7b72.Td2a8ffsamples_per_frameTff7b72/Tff7b72selfTff7b72.Td2a8ffsamplerate
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff samplerate set to Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyfrequencyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsamplerateTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff frame time is Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyshorttimeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_timeTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3decodedTb4b4b4: Te6edf3frame_samples Tff7b72= Te6edf3sourceTff7b72.Td2a8ffcodecTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3frameTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3frame_samples Tff7b72= Te6edf3frame

T8b949e# TODO: Add resampling for all source types
T8b949e# if CODEC_OUTPUT_RATE != self.samplerate:
T8b949e# frame_samples = resample(frame_samples, source.bitdepth, source.channels, CODEC_OUTPUT_RATE, self.samplerate)

Tff7b72selfTff7b72.Td2a8ffincoming_framesTb4b4b4[Te6edf3sourceTb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3frame_samplesTb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ff_mixing_gainTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmutedTb4b4b4: Tff7b72return T79c0ff0.0
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffgain Tff7b72== T79c0ff0.0Tb4b4b4: Tff7b72return T79c0ff1.0
Tff7b72elseTb4b4b4: Tff7b72return T79c0ff10Tff7b72*Tff7b72*Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffgainTff7b72/T79c0ff10Tb4b4b4)

Tff7b72def Td2a8ff_mixer_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffmixer_lockTb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsink Tff7b72and Tff7b72selfTff7b72.Td2a8ffsinkTff7b72.Td2a8ffcan_receiveTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3source_count Tff7b72= T79c0ff0
Te6edf3mixed_frame Tff7b72= Tff7b72None
Tff7b72for Te6edf3source Tff7b72in Tff7b72selfTff7b72.Td2a8ffincoming_framesTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffincoming_framesTb4b4b4[Te6edf3sourceTb4b4b4]Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3next_frame Tff7b72= Tff7b72selfTff7b72.Td2a8ffincoming_framesTb4b4b4[Te6edf3sourceTb4b4b4]Tff7b72.Td2a8ffpopleftTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3source_count Tff7b72== T79c0ff0Tb4b4b4: Te6edf3mixed_frame Tff7b72= Te6edf3next_frameTff7b72*Tff7b72selfTff7b72.Td2a8ff_mixing_gain
Tff7b72elseTb4b4b4: Te6edf3mixed_frame Tff7b72= Te6edf3mixed_frame Tff7b72+ Te6edf3next_frameTff7b72*Tff7b72selfTff7b72.Td2a8ff_mixing_gain
Te6edf3source_count Tff7b72+Tff7b72= T79c0ff1

Tff7b72if Te6edf3source_count Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3mixed_frame Tff7b72= Te6edf3npTff7b72.Td2a8ffclipTb4b4b4(Te6edf3mixed_frameTb4b4b4, Tff7b72-T79c0ff1.0Tb4b4b4, T79c0ff1.0Tb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72>Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4:
Tff7b72if Te6edf3mixed_frameTff7b72.Td2a8ffmaxTb4b4b4(Tb4b4b4) Tff7b72>Tff7b72= T79c0ff1.0 Tff7b72or Te6edf3mixed_frameTff7b72.Td2a8ffminTb4b4b4(Tb4b4b4) Tff7b72<Tff7b72= Tff7b72-T79c0ff1.0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSignal clipped on Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)

Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcodecTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsinkTff7b72.Td2a8ffhandle_frameTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3mixed_frameTb4b4b4)Tb4b4b4, Tff7b72selfTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsinkTff7b72.Td2a8ffhandle_frameTb4b4b4(Te6edf3mixed_frameTb4b4b4, Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while mixing frame on Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_timeTff7b72*T79c0ff0.1Tb4b4b4)

Tff7b72elseTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffframe_timeTff7b72*T79c0ff0.1Tb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ffcodecTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_codec

Tf0883e@codecTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffcodecTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3codecTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3codec Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_codec Tff7b72= Tff7b72None
Tff7b72elif Tff7b72not Tffa657issubclassTb4b4b4(Tffa657typeTb4b4b4(Te6edf3codecTb4b4b4)Tb4b4b4, Te6edf3CodecTb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3CodecErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid codec specified for Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_codec Tff7b72= Te6edf3codec

Tff7b72if Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffpreferred_samplerateTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72= Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffpreferred_samplerate
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsamplerate Tff7b72= Te6edf3BackendTff7b72.Td2a8ffSAMPLERATE

Tff7b72if Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffframe_quanta_msTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftarget_frame_msTff7b72%Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffframe_quanta_ms Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftarget_frame_ms Tff7b72= Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Tff7b72selfTff7b72.Td2a8fftarget_frame_msTff7b72/Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffframe_quanta_msTb4b4b4)Tff7b72*Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffframe_quanta_ms
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff target frame time quantized to Tffd700{Tff7b72selfTff7b72.Td2a8fftarget_frame_msTffd700}Ta5d6ffms due to codec frame quantaTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffframe_max_msTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftarget_frame_ms Tff7b72> Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffframe_max_msTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftarget_frame_ms Tff7b72= Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffframe_max_ms
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff target frame time clamped to Tffd700{Tff7b72selfTff7b72.Td2a8fftarget_frame_msTffd700}Ta5d6ffms due to codec frame limitTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffvalid_frame_msTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftarget_frame_ms Tff7b72in Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffvalid_frame_msTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftarget_frame_ms Tff7b72= Tffa657minTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffvalid_frame_msTb4b4b4, Te6edf3keyTff7b72=Tff7b72lambda Te6edf3tTb4b4b4:Tffa657absTb4b4b4(Te6edf3tTff7b72-Tff7b72selfTff7b72.Td2a8fftarget_frame_msTb4b4b4)Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff target frame time clamped to closest valid value of Tffd700{Tff7b72selfTff7b72.Td2a8fftarget_frame_msTffd700}Ta5d6ffms Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ffsourceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_source

Tf0883e@sourceTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffsourceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sourceTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_source Tff7b72= Te6edf3source

Tf0883e@property
Tff7b72def Td2a8ffsinkTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_sink

Tf0883e@sinkTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffsinkTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sinkTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sink Tff7b72= Te6edf3sink


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────